#ifndef ____Constraint__
#define ____Constraint__

/*!
 * \file Constraint.h
 * \brief Déclaration des méthodes sur les contraintes
 * \author AMMAR Inès (Responsable), CARBONNEL Jessie (Relecture)
 * \version 1.0
 * \date 01 mars 2013
 */

#include <iostream>
#include <set>
#include <string>
#include "Outcome.h"
#include "Omega.h"
#include "Preference.h"

/*!
 * \class Constraint
 * \brief Classe sur les contraintes.
*/ 
class Constraint{

private :
    std::set<int> left; /*!< Liste d'Outcomes de la partie gauche de la contrainte*/
    std::set<int> right; /*!< Liste d'Outcomes de la partie droite de la contraite*/
	std::string semantic ; /*!< La sémantique de la préférence*/
    
public :

    Constraint(const Preference &p);
	
	/*!
     * \fn list<Outcome> getLeft()const
	 * \brief Permet d'obtenir la liste contenant la partie gauche de la contrainte.
	 * \return Renvoie une liste contenant la partie gauche de la contrainte. 
	 */	
    std::set<int> getLeft()const;
	
	/*!
     * \fn list<Outcome> getRight()const
	 * \brief Permet d'obtenir la liste contenant la partie droite de la contrainte.
	 * \return Renvoie une liste contenant la partie droite de la contrainte.
	 */	
    std::set<int> getRight()const;	

    /*!
     * \fn bool addInRight(Outcome o)
     * \brief Ajoute une Outcome dans la partie droite.
     * \param o une instance de la classe Outcome.
     * \return Ne renvoie rien.
     */
    void addInRight(int);

    /*!
     * \fn bool addInLeft(Outcome o)
     * \brief Ajoute une Outcome dans la partie gauche.
     * \param o une instance de la classe Outcome.
     * \return Ne renvoie rien.
     */
    void addInLeft(int);
	
	/*!
     * \fn bool isInLeft(Outcome o)const
	 * \brief Permet de savoir si l'outcome se situe à gauche de la contraite.
	 * \param o une instance de la classe Outcome
	 * \return Renvoie Vrai si l'Outcome donnée est dans la partie gauche, Faux sinon.
	 */	
    bool isInLeft(int o)const;	
	
	/*!
     * \fn bool isInRight(Outcome o)const
	 * \brief Permet de savoir si l'outcome se situe à droite de la contraite.
	 * \param o une instance de la classe Outcome
	 * \return Renvoie Vrai si l'Outcome donnée est dans la partie droite, Faux sinon.
	 */	
    bool isInRight(int o)const;
	
	/*!
     * \fn void showConstraint()const
	 * \brief Permet d'afficher les informations concernant la contrainte.
	 * \return Ne renvoie rien.
	 */	
    void show()const;	
	
	/*!
     * \fn deleteOutcomeInRight(Outcome o)
	 * \brief Permet d'effacer une Outcome dans la liste de droite.
	 * \param o une instance de la classe Outcome
	 * \return Ne retourne rien.
	 */	
    void deleteOutcomeInRight(int o);
	
	/*!
	 * \fn deleteOutcomeInLeft(Outcome o)
	 * \brief Permet d'effacer une Outcome dans la liste de gauche.
	 * \param o une instance de la classe Outcome
	 * \return Ne retourne rien.
	 */	
    void deleteOutcomeInLeft(int o);

	/*!
     * \fn getSizeLeft()const;
	 * \brief Permet de connaitre le nombre d'Outcome dans la liste de gauche.
	 * \return Retourne un entier qui représente la taille de la liste de gauche.
	 */	
	int getSizeLeft()const;

	/*!
     * \fn getSizeRight()const;
	 * \brief Permet de connaitre le nombre d'Outcome dans la liste de droite.
	 * \return Retourne un entier qui représente la taille de la liste de droite.
	 */
	int getSizeRight()const;

	/*!
     * \fn string getSemantic()const;
	 * \brief Renvoie la semantique de la contrainte.
	 * \return Retourne une chaine de charactere représentant la sémantique de la contrainte.
	 */
	std::string getSemantic()const;
	/*!
	 * \fn setSemantic(string s);
	 * \brief Change la sémantique de la contrainte.
	 * \param s la nouvelle sémantique.
	 * \return Ne retourne rien.
	 */
	void setSemantic(std::string);
};

#endif /* defined(____Constraint__) */
